水無瀬の部屋 > Programming > sample > cur2cpp > instdlg.cpp |
---|
1: //*********************************************************
2: // プロジェクト: cur2cpp
3: // ファイル名: instdlg.cpp
4: //*********************************************************
5: #include "instdlg.h" //
6: #include "install.h" //
7: #include "res.h" //
8: #include <misc/atoffset.h>
9: #include <header/myweburl.h> //
10: #include <dlg/aboutbox/aboutbox.h> //
11:
12:
13: //---------------------------------------------------------
14: // テスト関数 の 宣言
15: //---------------------------------------------------------
16: DECLARE_TESTPROC( test_InstallDlg );
17:
18:
19: //---------------------------------------------------------
20: // ファイルスコープ関数 の 宣言
21: //---------------------------------------------------------
22: static bool InitInstallDlgControls( HWND hWnd, DWORD more );
23: static bool SetInstallDlgData( HWND hWnd, const install_t *info );
24: static bool GetInstallDlgData( HWND hWnd, install_t *info );
25: static bool EnableDlgItemGroup( HWND hWnd, id_t id, bool bEnable );
26: static bool ShowDlgItemGroup( HWND hWnd, id_t id, bool bShow );
27: static bool InitInstallDlgSystemMenu( HWND hWnd );
28: static INT_PTR CALLBACK InstallDlgProc( HWND, UINT, WPARAM, LPARAM );
29:
30:
31: //---------------------------------------------------------
32: // ファイルスコープ変数 の 定義
33: //---------------------------------------------------------
34: //
35: static struct g_dlg_tag
36: {
37: bool ico;
38: DWORD more;
39: RECT rcClient;
40: SIZE szMinSize;
41: install_t info;
42: } g_dlg;
43:
44: //
45: static const struct g_ddx_tag
46: {
47: id_t id;
48: DWORD flag;
49: int check;
50: int more;
51: int reg;
52: int reg_title;
53: int menu;
54: int menu_title;
55: int cmdline;
56: int cmdline_title;
57: int group;
58: }
59: g_ddx[] =
60: {
61: #define MAKE_DDX( name ) { ID_ ## name, FLAG_ ## name, IDC_ ## name, IDC_MORE_ ## name, IDC_REGPATH_ ## name, IDC_STATIC_REGPATH_ ## name, IDC_MENUTITLE_ ## name, IDC_STATIC_MENUTITLE_ ## name, IDC_CMDLINE_ ## name, IDC_STATIC_CMDLINE_ ## name, IDC_GROUP_ ## name }
62: MAKE_DDX( ICO ),
63: MAKE_DDX( CUR ),
64: #undef MAKE_DDX
65: };
66: COMPILE_ASSERT( numof(g_ddx) == numof( ((install_t *)null)->reg ) );
67:
68: // 各コントロールIDへのアクセス
69: static const size_t g_offset[] =
70: {
71: #define DDX_MEMBER_OFFSET( member ) offsetof( struct g_ddx_tag, member )
72: DDX_MEMBER_OFFSET( check ),
73: DDX_MEMBER_OFFSET( more ),
74: DDX_MEMBER_OFFSET( reg ),
75: DDX_MEMBER_OFFSET( reg_title ),
76: DDX_MEMBER_OFFSET( menu ),
77: DDX_MEMBER_OFFSET( menu_title ),
78: DDX_MEMBER_OFFSET( cmdline ),
79: DDX_MEMBER_OFFSET( cmdline_title ),
80: DDX_MEMBER_OFFSET( group ),
81: #undef DDX_MEMBER_OFFSET
82: };
83:
84:
85: //*********************************************************
86: // InstallDlg
87: // アプリケーションを拡張子に関連づける
88: //*********************************************************
89: bool
90: InstallDlg
91: (
92: HWND hwndOwner
93: )
94: {
95: CALLONCE_TESTPROC( test_InstallDlg ); // [テスト]
96:
97: // パラメタの仮定
98: ASSERT( !hwndOwner || IsValidWindow( hwndOwner ) );
99:
100: HINSTANCE hInstance = GetModuleHandle( null );
101: const INT_PTR result = DialogBoxParam
102: (
103: hInstance,
104: MAKEINTRESOURCE( INSTALL_BOX ),
105: hwndOwner,
106: InstallDlgProc,
107: null
108: );
109: return IDOK == result;
110: }//InstallDlg
111:
112:
113: //******************************************************************************************************************
114: //
115: //******************************************************************************************************************
116: static INT_PTR OnInstallInitDialog( HWND hWnd, WPARAM wParam, LPARAM lParam );
117: static INT_PTR OnInstallDestroy( HWND hWnd );
118: static INT_PTR OnInstallCommand( HWND hWnd, WPARAM wParam, LPARAM lParam );
119: static INT_PTR OnInstallSystemCommand( HWND hWnd, WPARAM wParam, LPARAM lParam );
120: static INT_PTR OnInstallHitTest( HWND hWnd, WPARAM wParam, LPARAM lParam );
121: static INT_PTR OnInstallGetMinMaxInfo( HWND hWnd, LPARAM lParam );
122: static INT_PTR OnInstallSize( HWND hWnd, WPARAM wParam, LPARAM lParam );
123:
124:
125: //*********************************************************
126: // InstallDlgProc
127: //*********************************************************
128: static
129: INT_PTR
130: CALLBACK
131: InstallDlgProc
132: (
133: HWND hWnd,
134: UINT uMsg,
135: WPARAM wParam,
136: LPARAM lParam
137: )
138: {
139: // パラメタの仮定
140: ASSERT( IsValidWindow( hWnd ) );
141:
142: switch( uMsg )
143: {
144: case WM_DESTROY: return OnInstallDestroy( hWnd );
145: case WM_NCHITTEST: return OnInstallHitTest( hWnd, wParam, lParam );
146: case WM_INITDIALOG: return OnInstallInitDialog( hWnd, wParam, lParam );
147: case WM_COMMAND: return OnInstallCommand( hWnd, wParam, lParam );
148: case WM_SYSCOMMAND: return OnInstallSystemCommand( hWnd, wParam, lParam );
149: case WM_GETMINMAXINFO: return OnInstallGetMinMaxInfo( hWnd, lParam );
150: case WM_SIZE: return OnInstallSize( hWnd, wParam, lParam );
151: default: return false;
152: }
153: }//InstallDlgProc
154:
155: //*********************************************************
156: // OnInstallInitDialog - WM_INITDIALOG
157: // ダイアログが作成された。
158: // この関数が抜けるまでダイアログは表示されない。
159: // 明示的にフォーカスを移動した場合は 真 を返せ。
160: // さもなくば 偽 を返せ。
161: // HWND wParam …… フォーカスを受け取る予定のコントロール
162: // LPARAM lParam …… ダイアログの初期化パラメタ
163: //*********************************************************
164: static
165: INT_PTR
166: OnInstallInitDialog
167: (
168: HWND hWnd,
169: WPARAM _unuse( wParam ),
170: LPARAM _unuse( lParam )
171: )
172: {
173: // パラメタの仮定
174: ASSERT( IsValidWindow( hWnd ) );
175: ASSERT( IsValidInitDialogMessageParam( wParam, lParam ) );
176:
177: // ダイアログ の 初期化
178: {
179: HINSTANCE hInstance = GetModuleHandle( null );
180: HICON hIcon = SHGetInstanceIcon( hInstance, SHGFI_LARGEICON );
181: HICON hIconSm = SHGetInstanceIcon( hInstance, SHGFI_SMALLICON );
182: SetWindowIcon( hWnd, ICON_BIG, hIcon ); // 大きいアイコン
183: SetWindowIcon( hWnd, ICON_SMALL, hIconSm ); // 小さいアイコン
184: VERIFY( WindowMoveToCursorPos( hWnd ) );
185:
186: // ダイアログ情報 g_dlg の 初期化
187: {
188: //
189: VERIFY( GetClientRect( hWnd, &g_dlg.rcClient ) );
190: VERIFY( GetWindowSize( hWnd, &g_dlg.szMinSize ) );
191:
192: //
193: VERIFY( LoadInstallInfo( &g_dlg.info ) );
194:
195: // 全ての詳細を隠す
196: g_dlg.more = 0;
197:
198: //
199: g_dlg.ico = (FLAG_ICO == (FLAG_ICO & g_dlg.info.flags));
200: }
201: }
202:
203: // システムメニュー の 初期化
204: VERIFY( InitInstallDlgSystemMenu( hWnd ) );
205:
206: // コントロール の 初期化
207: VERIFY( InitInstallDlgControls( hWnd, g_dlg.more ) );
208:
209: // コントロール値 の 設定
210: VERIFY( SetInstallDlgData( hWnd, &g_dlg.info ) );
211:
212: return false;
213: }//OnInstallInitDialog
214:
215: //*********************************************************
216: // OnInstallDestroy - WM_DESTROY
217: // まもなくウィンドウが破棄される。
218: // ウィンドウに関連付けた独自リソースを破棄する。
219: // 常に 真 を返す。
220: //*********************************************************
221: static
222: INT_PTR
223: OnInstallDestroy
224: (
225: HWND _unuse( hWnd )
226: )
227: {
228: // パラメタの仮定
229: ASSERT( IsValidWindow( hWnd ) );
230:
231: return true;
232: }//OnInstallDestroy
233:
234: //*********************************************************
235: // OnInstallHitTest - WM_NCHITTEST
236: // カーソル・イベントがあるたびに呼び出される。
237: // カーソルが存在する位置を示す値を返す。
238: // GET_X_LPARAM( lParam ) …… カーソルのスクリーン x 座標
239: // GET_Y_LPARAM( lParam ) …… カーソルのスクリーン y 座標
240: //*********************************************************
241: static
242: INT_PTR
243: OnInstallHitTest
244: (
245: HWND hWnd,
246: WPARAM wParam,
247: LPARAM lParam
248: )
249: {
250: // パラメタの仮定
251: ASSERT( IsValidWindow( hWnd ) );
252:
253: // サイズ変更矢印の変換ルール一覧
254: const struct { LRESULT from; LRESULT to; } trans[] =
255: {
256: { HTCLIENT, HTCAPTION }, // クライアント領域を掴んで移動可能に
257: { HTTOP, HTBORDER }, // 上端の縦矢印 → 矢印なし
258: { HTBOTTOM, HTBORDER }, // 下端の縦矢印 → 矢印なし
259: { HTTOPLEFT, HTLEFT }, // 左上隅の斜め矢印 → 左右矢印
260: { HTTOPRIGHT, HTRIGHT }, // 右上隅の斜め矢印 → 左右矢印
261: { HTBOTTOMLEFT, HTLEFT }, // 左下隅の斜め矢印 → 左右矢印
262: { HTBOTTOMRIGHT, HTRIGHT }, // 右下隅の斜め矢印 → 左右矢印
263: };
264: // 変換一覧にあれば変換した値を返す
265: const LRESULT lResult = DefWindowProc( hWnd, WM_NCHITTEST, wParam, lParam );
266: {for( int i = 0; i < numof( trans ); ++i )
267: {
268: if ( lResult == trans[ i ].from )
269: {
270: SetWindowLongPtr64( hWnd, DWL_MSGRESULT, trans[ i ].to );
271: return true;
272: }
273: }}
274:
275: return false;
276: }//OnInstallHitTest
277:
278: //*********************************************************
279: // OnInstallGetMinMaxInfo
280: //*********************************************************
281: static
282: INT_PTR
283: OnInstallGetMinMaxInfo
284: (
285: HWND hWnd,
286: LPARAM lParam
287: )
288: {
289: // パラメタの仮定
290: ASSERT( IsValidWindow( hWnd ) );
291: ASSERT( IsValidPtr( (MINMAXINFO *)lParam, sizeof(MINMAXINFO) ) );
292:
293: //
294: MINMAXINFO *pmmi = (MINMAXINFO *)lParam;
295:
296: //
297: pmmi->ptMinTrackSize.y = g_dlg.szMinSize.cy;
298: pmmi->ptMaxTrackSize.y = g_dlg.szMinSize.cy;
299:
300: //
301: pmmi->ptMinTrackSize.x = ((0 != g_dlg.more) ? 2 : 1) * g_dlg.szMinSize.cx;
302:
303: //
304: if ( 0 == g_dlg.more )
305: {
306: pmmi->ptMaxTrackSize.x = g_dlg.szMinSize.cx;
307: }
308:
309: return true;
310: }//OnInstallGetMinMaxInfo
311:
312: //*********************************************************
313: // OnInstallSize
314: //*********************************************************
315: static
316: INT_PTR
317: OnInstallSize
318: (
319: HWND hWnd,
320: WPARAM wParam,
321: LPARAM lParam
322: )
323: {
324: // パラメタの仮定
325: ASSERT( IsValidWindow( hWnd ) );
326:
327: // 最小化時は無視
328: if ( SIZE_MINIMIZED == wParam )
329: return true;
330:
331: // 移動とサイズ変更のリスト
332: const struct
333: {
334: int nID;
335: bool pos_x;
336: bool pos_y;
337: bool size_x;
338: bool size_y;
339: }
340: ctrl[] =
341: {
342: // { IDC_CUR, false, false, false, false },
343: { IDC_MORE_CUR, true, false, false, false },
344: { IDC_REGPATH_CUR, false, false, true, false },
345: { IDC_MENUTITLE_CUR, false, false, true, false },
346: { IDC_CMDLINE_CUR, false, false, true, false },
347: { IDC_GROUP_CUR, false, false, true, false },
348: // { IDC_ICO, false, false, false, false },
349: { IDC_MORE_ICO, true, false, false, false },
350: { IDC_REGPATH_ICO, false, false, true, false },
351: { IDC_MENUTITLE_ICO, false, false, true, false },
352: { IDC_CMDLINE_ICO, false, false, true, false },
353: { IDC_GROUP_ICO, false, false, true, false },
354: { IDOK, true, false, false, false },
355: { IDCANCEL, true, false, false, false }
356: };
357: HDWP hdwp = BeginDeferWindowPos( numof(ctrl) );
358: if ( hdwp )
359: {
360: const int width = LOWORD(lParam);
361: const int height = HIWORD(lParam);
362: const int shift_x = width - g_dlg.rcClient.right;
363: const int shift_y = height - g_dlg.rcClient.bottom;
364: {for( int i = 0; i < numof(ctrl); ++i )
365: {
366: ASSERT( IsValidDlgItem( hWnd, ctrl[ i ].nID ) );
367: VERIFY( ShiftDeferDlgItem
368: (
369: &hdwp,
370: hWnd,
371: ctrl[i].nID,
372: ctrl[i].pos_x ? shift_x : 0,
373: ctrl[i].pos_y ? shift_y : 0,
374: ctrl[i].size_x ? shift_x : 0,
375: ctrl[i].size_y ? shift_y : 0
376: ) );
377: }}
378: VERIFY( EndDeferWindowPos( hdwp ) );
379:
380: g_dlg.rcClient.right = width;
381: g_dlg.rcClient.bottom = height;
382: }
383: return true;
384: }//OnInstallSize
385:
386:
387: //******************************************************************************************************************
388: // OnInstallCommand - WM_COMMAND
389: //******************************************************************************************************************
390: static INT_PTR OnInstallCommandOK( HWND hWnd );
391: static INT_PTR OnInstallCommandCancel( HWND hWnd );
392: static INT_PTR OnInstallCommandDefault( HWND hWnd, WPARAM wParam );
393: static INT_PTR OnInstallCommandCheck( HWND hWnd, WPARAM wParam );
394: static INT_PTR OnInstallCommandMore( HWND hWnd, WPARAM wParam );
395:
396:
397: //*********************************************************
398: // OnInstallCommand - WM_COMMAND
399: // コマンド項目が選択された。
400: // 返値の意味は要求されたコマンド項目による。
401: // LOWORD(wParam) …… 選択されたコマンド項目の識別子。
402: // メニューの区切り線が選択された場合は 0 が設定される。
403: // HIWORD(wParam) …… 通知コード。
404: // メッセージが メニュー から送信された場合は 0 が設定される。
405: // メッセージがアクセラレータから送信された場合は 1 が設定される。
406: // HWND lParam …… メッセージがコントロールから送信された場合はメッセージを送信したコントロールのハンドル。
407: //
408: //*********************************************************
409: static
410: INT_PTR
411: OnInstallCommand
412: (
413: HWND hWnd,
414: WPARAM wParam,
415: LPARAM _unuse( lParam )
416: )
417: {
418: // パラメタの仮定
419: ASSERT( IsValidWindow( hWnd ) );
420: ASSERT( IsValidCommandMessageParam( wParam, lParam ) );
421:
422: switch( LOWORD( wParam ) )
423: {
424: case IDOK: return OnInstallCommandOK( hWnd );
425: case IDCANCEL: return OnInstallCommandCancel( hWnd );
426: default: return OnInstallCommandDefault( hWnd, wParam );
427: }
428: }//OnInstallCommand
429:
430: //*********************************************************
431: // OnInstallCommandOK
432: //*********************************************************
433: static
434: INT_PTR
435: OnInstallCommandOK
436: (
437: HWND hWnd
438: )
439: {
440: // パラメタの仮定
441: ASSERT( IsValidWindow( hWnd ) );
442:
443: //
444: install_t info; // 設定値
445: if ( ! GetInstallDlgData( hWnd, &info ) )
446: {
447: return false;
448: }
449: ASSERT( IsValidInstallInfo( &info ) );
450:
451: // 関連づけ
452: const DWORD modified = GetModifiedFlags( &info, &g_dlg.info );
453: VERIFY( SaveInstallInfo( &info, modified ) );
454:
455: //
456: VERIFY( EndDialog( hWnd, IDOK ) );
457:
458: return true;
459: }//OnInstallCommandOK
460:
461: //*********************************************************
462: // OnInstallCommandCancel
463: //*********************************************************
464: static
465: INT_PTR
466: OnInstallCommandCancel
467: (
468: HWND hWnd
469: )
470: {
471: // パラメタの仮定
472: ASSERT( IsValidWindow( hWnd ) );
473:
474: VERIFY( EndDialog( hWnd, IDCANCEL ) );
475:
476: return true;
477: }//OnInstallCommandCancel
478:
479: //*********************************************************
480: // OnInstallCommandDefault
481: //*********************************************************
482: static
483: INT_PTR
484: OnInstallCommandDefault
485: (
486: HWND hWnd,
487: WPARAM wParam
488: )
489: {
490: // パラメタの仮定
491: ASSERT( IsValidWindow( hWnd ) );
492:
493: {for( int i = 0; i < numof( g_ddx ); ++i )
494: {
495: const int id = LOWORD( wParam );
496:
497: if ( id == g_ddx[ i ].check )
498: return OnInstallCommandCheck( hWnd, wParam );
499: if ( id == g_ddx[ i ].more )
500: return OnInstallCommandMore( hWnd, wParam );
501: }}
502:
503: return false;
504: }//OnInstallCommandDefault
505:
506: //*********************************************************
507: // OnInstallCommandCheck
508: //*********************************************************
509: static
510: INT_PTR
511: OnInstallCommandCheck
512: (
513: HWND hWnd,
514: WPARAM wParam
515: )
516: {
517: // パラメタの仮定
518: ASSERT( IsValidWindow( hWnd ) );
519:
520: //
521: {for( int i = 0; i < numof( g_ddx ); ++i )
522: {
523: if ( g_ddx[ i ].check == LOWORD( wParam ) )
524: {
525: const bool bEnable = (BST_CHECKED == IsDlgButtonChecked( hWnd, g_ddx[ i ].check ));
526: EnableDlgItemGroup( hWnd, g_ddx[ i ].id, bEnable );
527: return true;
528: }
529: }}
530:
531: UNREACHCODE( "g_ddx の抜け?" );
532: return true;
533: }//OnInstallCommandCheck
534:
535: //*********************************************************
536: // OnInstallCommandMore
537: //*********************************************************
538: static
539: INT_PTR
540: OnInstallCommandMore
541: (
542: HWND hWnd,
543: WPARAM wParam
544: )
545: {
546: // パラメタの仮定
547: ASSERT( IsValidWindow( hWnd ) );
548:
549: //
550: {for( int i = 0; i < numof( g_ddx ); ++i )
551: {
552: if ( g_ddx[ i ].more == LOWORD( wParam ) )
553: {
554: g_dlg.more ^= g_ddx[ i ].flag;
555: VERIFY( ShowDlgItemGroup( hWnd, g_ddx[ i ].id, 0 != (g_dlg.more & g_ddx[ i ].flag) ) );
556: return true;
557: }
558: }}
559:
560: UNREACHCODE( "g_ddx の抜け?" );
561: return true;
562: }//OnInstallCommandMore
563:
564:
565: //******************************************************************************************************************
566: // WM_SYSCOMMAND
567: //******************************************************************************************************************
568: static INT_PTR OnInstallSystemCommandSetDefault( HWND hWnd );
569: static INT_PTR OnInstallSystemCommandAbout( HWND hWnd );
570:
571:
572: //*********************************************************
573: // OnInstallSystemCommand - WM_SYSCOMMAND
574: //*********************************************************
575: static
576: INT_PTR
577: OnInstallSystemCommand
578: (
579: HWND hWnd,
580: WPARAM wParam,
581: LPARAM _unuse( lParam )
582: )
583: {
584: // パラメタの仮定
585: ASSERT( IsValidWindow( hWnd ) );
586: ASSERT( IsValidSystemCommandMessageParam( wParam, lParam ) );
587:
588: switch( LOWORD(wParam) )
589: {
590: case IDM_ABOUT: return OnInstallSystemCommandAbout( hWnd );
591: case IDM_SETDEFAULT: return OnInstallSystemCommandSetDefault( hWnd );
592: default: return false;
593: }
594: }//OnInstallSystemCommand
595:
596: //*********************************************************
597: // OnInstallSystemCommandAbout
598: //*********************************************************
599: static
600: INT_PTR
601: OnInstallSystemCommandAbout
602: (
603: HWND hWnd
604: )
605: {
606: // パラメタの仮定
607: ASSERT( IsValidWindow( hWnd ) );
608:
609: ABOUTBOX_t tmp; // AboutBox のパラメータ
610: tmp.url = URL_WEBPAGE;
611: AboutBox( hWnd, &tmp ); // 「……について」ダイアログを表示する。
612:
613: return true;
614: }//OnInstallSystemCommandAbout
615:
616: //*********************************************************
617: // OnInstallSystemCommandSetDefault
618: //*********************************************************
619: static
620: INT_PTR
621: OnInstallSystemCommandSetDefault
622: (
623: HWND hWnd
624: )
625: {
626: // パラメタの仮定
627: ASSERT( IsValidWindow( hWnd ) );
628:
629: VERIFY( SetInstallDlgData( hWnd, &g_dlg.info ) );
630:
631: //
632: g_dlg.ico = (FLAG_ICO == (FLAG_ICO & g_dlg.info.flags));
633:
634: // OnInstallSystemCommandUsePif(), InitInstallDlgControls() と重複している!
635: // 関数名を考えよう!
636: if ( g_dlg.ico )
637: {
638: VisibleDlgItem( hWnd, IDC_ICO, true );
639: VisibleDlgItem( hWnd, IDC_MORE_ICO, true );
640: }
641: else
642: {
643: VisibleDlgItem( hWnd, IDC_ICO, false );
644: VisibleDlgItem( hWnd, IDC_MORE_ICO, false );
645:
646: if ( FLAG_ICO == (g_dlg.more & FLAG_ICO) )
647: {
648: g_dlg.more ^= FLAG_ICO;
649: VERIFY( ShowDlgItemGroup( hWnd, ID_ICO, FLAG_ICO == (FLAG_ICO & g_dlg.more) ) );
650: }
651: }
652:
653: return true;
654: }//OnInstallSystemCommandSetDefault
655:
656:
657: //******************************************************************************************************************
658: // private - init
659: //******************************************************************************************************************
660: //*********************************************************
661: // InitInstallDlgSystemMenu
662: //*********************************************************
663: static
664: bool
665: InitInstallDlgSystemMenu
666: (
667: HWND hWnd
668: )
669: {
670: // パラメタの仮定
671: ASSERT( IsValidWindow( hWnd ) );
672:
673: HMENU hmenuSystem = GetSystemMenu( hWnd, false );
674: const int pos = GetMenuItemPos( hmenuSystem, SC_ZOOM );
675: if ( 0 <= pos )
676: {
677: const struct
678: {
679: UINT type;
680: UINT id;
681: const char *title;
682: }
683: item[] =
684: {
685: #define MAKE_MENUITEM( type, id, title ) { type, id, title }
686: MAKE_MENUITEM( MF_SEPARATOR, 0, null ),
687: MAKE_MENUITEM( MF_STRING, IDM_SETDEFAULT, "設定を初期値に戻す(&D)" ),
688: MAKE_MENUITEM( MF_STRING, IDM_ABOUT, "About(&A)" ),
689: #undef MAKE_MENUITEM
690: };
691: {for( int i = numof( item ); 0 < i; --i )
692: {
693: VERIFY( InsertMenu( hmenuSystem, pos+1, MF_BYPOSITION | item[ i-1 ].type, item[ i-1 ].id, item[ i-1 ].title ) );
694: // Menu_InsertSeparator( hmenuSystem, pos+1, MF_BYPOSITION );
695: }}
696: }
697:
698: return true;
699: }//InitInstallDlgSystemMenu
700:
701:
702: //******************************************************************************************************************
703: // private
704: //******************************************************************************************************************
705: static bool SetInstallDlgDataVerbList( HWND hwndListView, const char *verb );
706:
707:
708: //*********************************************************
709: // ShowDlgItemGroup
710: //*********************************************************
711: static
712: bool
713: ShowDlgItemGroup
714: (
715: HWND hWnd,
716: id_t id,
717: bool bShow
718: )
719: {
720: // パラメタの仮定
721: ASSERT( IsValidWindow( hWnd ) );
722: ASSERT( IS_VALID_ID( id ) );
723:
724: {for( int index = 0; index < numof( g_ddx ); ++index )
725: {
726: if ( id == g_ddx[ index ].id )
727: {
728: //
729: SetDlgItemText( hWnd, g_ddx[ index ].more, bShow ? "<< 詳細" : "詳細 >>" );
730:
731: //
732: {for( int i = 0; i < numof( g_offset ); ++i )
733: {
734: const int ctrl = atoffset( int, &g_ddx[ index ], g_offset[ i ] );
735: if ( (ctrl != g_ddx[ index ].check )
736: && (ctrl != g_ddx[ index ].more) )
737: {
738: if ( IsValidDlgItem( hWnd, ctrl ) )
739: {
740: VisibleDlgItem( hWnd, ctrl, bShow );
741: }
742: }
743: }}
744:
745: //
746: const int sign = bShow ? 1 : -1;
747: const int group_bottom = GetDlgItemBottom( hWnd, g_ddx[ index ].group );
748: const int more_bottom = GetDlgItemBottom( hWnd, g_ddx[ index ].more );
749: const int height = sign * (group_bottom - more_bottom);
750:
751: //
752: {for( int i = 0; i < numof( g_ddx ); ++i )
753: {
754: if ( i != index )
755: {
756: if ( more_bottom < GetDlgItemTop( hWnd, g_ddx[ i ].group ) )
757: {
758: {for( int j = 0; j < numof( g_offset ); ++j )
759: {
760: const int ctrl = atoffset( int, &g_ddx[ i ], g_offset[ j ] );
761: if ( IsValidDlgItem( hWnd, ctrl ) )
762: {
763: ShiftDlgItemPos( hWnd, ctrl, 0, height );
764: }
765: }}
766: }
767: }
768: }}
769:
770: //
771: ShiftDlgItemPos( hWnd, IDOK, 0, height );
772: ShiftDlgItemPos( hWnd, IDCANCEL, 0, height );
773:
774: //
775: g_dlg.szMinSize.cy += height;
776: ShiftWindowSize( hWnd, 0, height );
777: }
778: }}
779:
780: return true;
781: }//ShowDlgItemGroup
782:
783: //*********************************************************
784: // EnableDlgItemGroup
785: //*********************************************************
786: static
787: bool
788: EnableDlgItemGroup
789: (
790: HWND hWnd,
791: id_t id,
792: bool bEnable
793: )
794: {
795: // パラメタの仮定
796: ASSERT( IsValidWindow( hWnd ) );
797: ASSERT( IS_VALID_ID( id ) );
798:
799: //
800: {for( int index = 0; index < numof( g_ddx ); ++index )
801: {
802: if ( id == g_ddx[ index ].id )
803: {
804: {for( int i = 0; i < numof( g_offset ); ++i )
805: {
806: const int ctrl = atoffset( int, &g_ddx[ index ], g_offset[ i ] );
807: if ( (ctrl != g_ddx[ index ].check )
808: && (ctrl != g_ddx[ index ].more) )
809: {
810: if ( IsValidDlgItem( hWnd, ctrl ) )
811: {
812: EnableDlgItem( hWnd, ctrl, bEnable );
813: }
814: }
815: }}
816: }
817: }}
818:
819: return true;
820: }//EnableDlgItemGroup
821:
822: //*********************************************************
823: // GetInstallDlgData
824: //*********************************************************
825: static
826: bool
827: GetInstallDlgData
828: (
829: HWND hWnd,
830: install_t *info
831: )
832: {
833: // パラメタの仮定
834: ASSERT( IsValidWindow( hWnd ) );
835: ASSERT( IsValidPtr( info, sizeof( *info ) ) );
836: DESTROY_BUFFER( info, sizeof( *info ) ); // [破壊]
837:
838: // 関連づけ
839: info->flags = 0;
840: {for( int i = 0; i < numof( g_ddx ); ++i )
841: {
842: // check
843: if ( IsValidDlgItem( hWnd, g_ddx[ i ].check ) )
844: {
845: if ( BST_CHECKED == IsDlgButtonChecked( hWnd, g_ddx[ i ].check ) )
846: {
847: info->flags |= g_ddx[ i ].flag;
848: }
849: }
850:
851: //
852: {
853: ASSERT( IS_VALID_ID( g_ddx[ i ].id ) );
854: const size_t index = ID_INDEX( g_ddx[ i ].id );
855: ASSERT( IS_VALID_INDEX( index ) );
856: relation_t *reg = &info->reg[ index ];
857:
858: // default
859: strcopy( reg->menu, numof(reg->menu), g_dlg.info.reg[ index ].menu );
860: strcopy( reg->cmdline, numof(reg->cmdline), g_dlg.info.reg[ index ].cmdline );
861: strcopy( reg->regpath, numof(reg->regpath), g_dlg.info.reg[ index ].regpath );
862:
863: // regpath
864: if ( IsValidDlgItem( hWnd, g_ddx[ i ].reg ) )
865: {
866: VERIFY( 0 <= GetDlgItemText( hWnd, g_ddx[ i ].reg, reg->regpath, numof( reg->regpath ) ) );
867: }
868: // ASSERT( IsValidRegistryPathString( reg->regpath ) );
869:
870: // menu
871: if ( IsValidDlgItem( hWnd, g_ddx[ i ].menu ) )
872: {
873: VERIFY( 0 <= GetDlgItemText( hWnd, g_ddx[ i ].menu, reg->menu, numof( reg->menu ) ) );
874: }
875: ASSERT( IsValidStringPtr( reg->menu ) );
876:
877: // cmdline
878: if ( IsValidDlgItem( hWnd, g_ddx[ i ].cmdline ) )
879: {
880: VERIFY( 0 <= GetDlgItemText( hWnd, g_ddx[ i ].cmdline, reg->cmdline, numof( reg->cmdline ) ) );
881: }
882: ASSERT( IsValidCommandLineString( reg->cmdline ) );
883: }
884: }}
885:
886:
887: ASSERT( IsValidInstallInfo( info ) );
888: return true;
889: }//GetInstallDlgData
890:
891: //*********************************************************
892: // SetInstallDlgData
893: //*********************************************************
894: static
895: bool
896: SetInstallDlgData
897: (
898: HWND hWnd,
899: const install_t *info
900: )
901: {
902: // パラメタの仮定
903: ASSERT( IsValidWindow( hWnd ) );
904: ASSERT( IsValidInstallInfo( info ) );
905:
906: //
907: {for( int i = 0; i < numof( g_ddx ); ++i )
908: {
909: // check
910: const UINT uCheck = (g_ddx[ i ].flag == (info->flags & g_ddx[ i ].flag)) ? BST_CHECKED : BST_UNCHECKED;
911: if ( ! IsValidDlgItem( hWnd, g_ddx[ i ].check ) )
912: {
913: EnableDlgItemGroup( hWnd, g_ddx[ i ].id, false );
914: }
915: else
916: {
917: EnableDlgItemGroup( hWnd, g_ddx[ i ].id, BST_CHECKED == uCheck );
918: CheckDlgButton( hWnd, g_ddx[ i ].check, uCheck );
919: }
920:
921: //
922: {
923: ASSERT( IS_VALID_ID( g_ddx[ i ].id ) );
924: const size_t index = ID_INDEX( g_ddx[ i ].id );
925: ASSERT( IS_VALID_INDEX( index ) );
926: const relation_t *reg = &info->reg[ index ];
927: // ASSERT( IsValidRegistryPathString( reg->regpath ) );
928: ASSERT( IsValidCommandLineString( reg->cmdline ) );
929: ASSERT( IsValidStringPtr( reg->menu ) );
930:
931: // regpath
932: if ( IsValidDlgItem( hWnd, g_ddx[ i ].reg ) )
933: {
934: VERIFY( SetDlgItemText( hWnd, g_ddx[ i ].reg, reg->regpath ) );
935: }
936:
937: // menu
938: if ( IsValidDlgItem( hWnd, g_ddx[ i ].menu ) )
939: {
940: VERIFY( SetDlgItemText( hWnd, g_ddx[ i ].menu, reg->menu ) );
941: }
942:
943: // cmdline
944: if ( IsValidDlgItem( hWnd, g_ddx[ i ].cmdline ) )
945: {
946: VERIFY( SetDlgItemText( hWnd, g_ddx[ i ].cmdline, reg->cmdline ) );
947: }
948: }
949: }}
950:
951: return true;
952: }//SetInstallDlgData
953:
954:
955: //******************************************************************************************************************
956: // private - init controls
957: //******************************************************************************************************************
958: //*********************************************************
959: // InitInstallDlgControls
960: //*********************************************************
961: static
962: bool
963: InitInstallDlgControls
964: (
965: HWND hWnd,
966: DWORD more
967: )
968: {
969: // パラメタの仮定
970: ASSERT( IsValidWindow( hWnd ) );
971:
972: //
973: {for( int i = 0; i < numof( g_ddx ); ++i )
974: {
975: VERIFY( ShowDlgItemGroup( hWnd, g_ddx[ i ].id, 0 != (more & g_ddx[ i ].flag) ) );
976: }}
977:
978: // OnInstallSystemCommandUsePif(), OnInstallSystemCommandSetDefault() と重複している!
979: // 関数名を考えよう!
980: if ( g_dlg.ico )
981: {
982: VisibleDlgItem( hWnd, IDC_ICO, true );
983: VisibleDlgItem( hWnd, IDC_MORE_ICO, true );
984: }
985: else
986: {
987: VisibleDlgItem( hWnd, IDC_ICO, false );
988: VisibleDlgItem( hWnd, IDC_MORE_ICO, false );
989:
990: if ( FLAG_ICO == (g_dlg.more & FLAG_ICO) )
991: {
992: g_dlg.more ^= FLAG_ICO;
993: VERIFY( ShowDlgItemGroup( hWnd, ID_ICO, FLAG_ICO == (FLAG_ICO & g_dlg.more) ) );
994: }
995: }
996:
997: return true;
998: }//InitInstallDlgControls
999:
1000:
1001:
1002: //******************************************************************************************************************
1003: // TEST
1004: //******************************************************************************************************************
1005:
1006:
1007: #ifdef _DEBUG // デバッグ時のみ
1008:
1009:
1010: //*********************************************************
1011: // test_InstallDlg
1012: //*********************************************************
1013: DEFINE_TESTPROC( test_InstallDlg )
1014: {
1015: //---------------------------------------------------------
1016: // 定数 の テスト
1017: //---------------------------------------------------------
1018:
1019: // g_offset の 重複
1020: {for( int i = 0; i < numof( g_offset ) - 1; ++i )
1021: {
1022: {for( int j = i+1; j < numof( g_offset ); ++j )
1023: {
1024: ASSERT( i != j );
1025: ASSERT( g_offset[ i ] != g_offset[ j ] );
1026: }}
1027: }}
1028:
1029: // g_ddx の 範囲
1030: {for( int i = 0; i < numof( g_ddx ); ++i )
1031: {
1032: ASSERT( IS_VALID_ID( g_ddx[ i ].id ) );
1033: // ASSERT( (0 <= g_ddx[i].id) && (g_ddx[i].id < numof( ((install_t *)null)->reg )) );
1034: }}
1035:
1036: // g_ddx の 重複
1037: {for( int i = 0; i < numof( g_ddx ) - 1; ++i )
1038: {
1039: {for( int j = i+1; j < numof( g_ddx ); ++j )
1040: {
1041: ASSERT( i != j );
1042: ASSERT( g_ddx[ i ].id != g_ddx[ j ].id );
1043: ASSERT( 0 == (g_ddx[ i ].flag & g_ddx[ j ].flag) );
1044:
1045: {for( int k = 0; k < numof( g_offset ); ++k )
1046: {
1047: const int ctrl_i = atoffset( int, &g_ddx[ i ], g_offset[ k ] );
1048: const int ctrl_j = atoffset( int, &g_ddx[ j ], g_offset[ k ] );
1049: ASSERT( ctrl_i != ctrl_j );
1050: }}
1051: }}
1052: }}
1053:
1054:
1055: //---------------------------------------------------------
1056: // ファイルスコープ関数 の テスト
1057: //---------------------------------------------------------
1058:
1059: //---------------------------------------------------------
1060: // 公開関数 の テスト
1061: //---------------------------------------------------------
1062:
1063: }//test_InstallDlg
1064:
1065:
1066: #endif // #ifdef _DEBUG
1067:
1068:
1069: //** end **
参照:
水無瀬の部屋 > sample > cur2cpp > instdlg.cpp |
---|
このページは cpp2web が出力しました。
水無瀬 優 postmaster@katsura-kotonoha.sakura.ne.jp
http://katsura-kotonoha.sakura.ne.jp/prog/code/cur2cpp/instdlg_cpp.shtml